package org.huangrui.design.pattern.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class DynamicProxyTemplate implements InvocationHandler {
    private Object target;

    public DynamicProxyTemplate(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 前置处理
        System.out.println("前置处理操作（例如：事务开启）");

        Object result = null;
        String user = Session.getUser();
        if ("admin".equals(user)) {
            System.out.println(user + "请求的操作被允许");
            // 调用被代理类的方法
            result = method.invoke(target, args);
        } else {
            System.out.println(user + "请求的操作被拒绝");
        }

        // 后置处理
        System.out.println("后置处理操作（例如：事务提交等）");

        return result;
    }

    /**
     * 创建一个动态代理对象
     *
     * @param target 要被代理的目标对象，该对象的类必须实现至少一个接口
     * @param <T> 目标对象的类型
     * @return 返回目标对象的代理实例，具有与目标对象相同的接口类型
     */
    public static <T> T createProxy(T target) {
        // 使用JDK动态代理创建代理实例
        // 代理对象将使用目标对象的类加载器、实现的接口以及自定义的InvocationHandler
        return (T) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new DynamicProxyTemplate(target)
        );
    }

}
